"use strict";

module.exports = () => {
  return async (ctx, next) => {
    const app = ctx.app;
    const whiteList = app.config.whiteList;
    const url = ctx.request.url;
    // vue首页放行
    if (url === "/") {
      await next();
      return;
    }
    // 校验路由白名单
    const isWhiteUrl = whiteList.some(item => {
      if (item === url || url.search(item) !== -1) {
        return true;
      }
      return false;
    });
    // 在白名单中，放行
    if (isWhiteUrl) {
      await next();
      return;
    }
    // 校验token
    const token = ctx.request.headers.authorization;
    try {
      app.jwt.verify(token, app.config.jwt.secret);
    } catch (error) {
      if (error.name === "JsonWebTokenError") {
        ctx.response.status = 401;
        ctx.body = { code: 401, msg: "middleware-token无效" };
        return;
      }
    }
    // token校验通过，放行
    await next();
    return;
  };
};
